package com.jp.kefu.util;

import org.springframework.cglib.core.ReflectUtils;
import org.springframework.util.DigestUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.TypeUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

/**
 * 验证消息的确来自微信服务器,此验证用于在填写服务器配置时，验证服务器地址的有效性
 * @author lijin
 * @see <a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319">https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319</a>
 */
public abstract class ServerValidator {
    private static String token = "leegean";

    /**
     *若确认此次GET请求来自微信服务器，请原样返回echostr参数内容，则接入生效，成为开发者成功，否则接入失败。加密/校验流程如下：
     <p>1）将token、timestamp、nonce三个参数进行字典序排序</p>
     <p>2）将三个参数字符串拼接成一个字符串进行sha1加密</p>
     <p>3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信</p>
     * @param signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @param echostr 随机字符串
     * @return 验证结果
     */
    public static String validate(String signature, String timestamp, String nonce, String echostr){
        if (signature == null || timestamp == null || nonce == null || echostr == null) {
            return "";
        }
        ArrayList<String> strings = new ArrayList<>();
        strings.add(token);
        strings.add(timestamp);
        strings.add(nonce);
        //将token、timestamp、nonce三个参数进行字典序排序
        Collections.sort(strings);
        //将三个参数字符串拼接成一个字符串
        StringBuilder stringBuilder = new StringBuilder();
        for (String s : strings) {
            stringBuilder.append(s);
        }
        //进行sha1加密
        String result = org.apache.commons.codec.digest.DigestUtils.sha1Hex(stringBuilder.toString());
        if (result.equals(signature)) {
            return echostr;
        }
        return "";
    }

}
